package xyz.qy.implatform.service;

import com.baomidou.mybatisplus.extension.service.IService;
import xyz.qy.implatform.dto.GroupBanDTO;
import xyz.qy.implatform.dto.GroupMemberDTO;
import xyz.qy.implatform.dto.GroupQueryDTO;
import xyz.qy.implatform.entity.Group;
import xyz.qy.implatform.entity.GroupMember;
import xyz.qy.implatform.entity.User;
import xyz.qy.implatform.vo.CommonGroupVO;
import xyz.qy.implatform.vo.GroupInviteVO;
import xyz.qy.implatform.vo.GroupJoinVO;
import xyz.qy.implatform.vo.GroupMemberVO;
import xyz.qy.implatform.vo.GroupVO;
import xyz.qy.implatform.vo.MultCharacterGroupVO;
import xyz.qy.implatform.vo.PageResultVO;
import xyz.qy.implatform.vo.SwitchTemplateGroupVO;
import xyz.qy.implatform.vo.TemplateGroupCreateVO;

import java.util.List;


public interface IGroupService extends IService<Group> {


    GroupVO createGroup(GroupVO vo);

    GroupVO modifyGroup(GroupVO vo);

    void deleteGroup(Long groupId);

    void quitGroup(Long groupId);

    void kickGroup(Long groupId,Long userId);

    List<GroupVO>  findGroups();

    void invite(GroupInviteVO vo);

    Group GetById(Long groupId);

    /**
     * 根据id查找群聊，并进行缓存
     *
     * @param groupId 群聊id
     * @return 群聊实体
     */
    Group getAndCheckById(Long groupId);

    GroupVO findById(Long groupId);

    /**
     * 分页查询群聊
     *
     * @param dto 查询参数
     * @return 群聊列表
     */
    PageResultVO pageGroups(GroupQueryDTO dto);

    List<GroupMemberVO> findGroupMembers(Long groupId);

    GroupVO createTemplateGroup(TemplateGroupCreateVO templateGroupCreateVO);

    GroupVO switchTemplateGroup(SwitchTemplateGroupVO vo);

    GroupVO switchCommonGroup(CommonGroupVO vo);

    GroupVO switchMultCharacterGroup(MultCharacterGroupVO vo);

    GroupVO switchMoreCharactersGroup(MultCharacterGroupVO vo);

    GroupVO switchTemplateMultCharactersGroup(SwitchTemplateGroupVO vo);

    /**
     * 将用户加入公共群聊
     *
     * @param user 用户
     */
    GroupMember addToCommonGroup(User user, Long groupId);

    /**
     * 查询当前用户未加入的群聊
     *
     * @param keyWord 搜索关键词
     * @return 群聊
     */
    PageResultVO queryNotJoinGroups(String keyWord);

    /**
     * 请求加入群聊
     *
     * @param vo 群聊信息vo
     */
    void joinGroup(GroupJoinVO vo);

    /**
     * 禁言操作
     *
     * @param dto 入参
     */
    void banMsg(GroupBanDTO dto);

    /**
     * 解除禁言
     *
     * @param dto 入参
     */
    void unBanMsg(GroupBanDTO dto);

    /**
     * 检查用户加入的群聊数量
     *
     * @param userId 用户id
     */
    void checkUserGroupCount(Long userId);

    /**
     * 根据群主id查询群聊id
     *
     * @param userId 群主id
     * @return 群聊id
     */
    List<Long> findByOwnerId(Long userId);

    /**
     * 发送加群消息
     * @param group 群聊信息
     * @param recvIds 接收者id
     * @param sendToSelf 是否发送给自己
     */
    void sendAddGroupMessage(GroupVO group, List<Long> recvIds, Boolean sendToSelf);

    /**
     * 设置群聊管理员
     *
     * @param dto 入参
     */
    void setGroupAdmin(GroupMemberDTO dto);

    /**
     * 移除群聊管理员
     *
     * @param dto 入参
     */
    void removeGroupAdmin(GroupMemberDTO dto);
}
